With today's rapid technological development, programs—sequences of coded software instructions that are written to perform specified tasks on a particular computing device (e.g., desktop, laptop, notebook, tablet computer, personal digital assistant (PDA), mobile telephone, smart telephone, and the like) within a targeted operating system—have significantly grown in complexity and include programs that execute in a distributed and out-of-sequence manner. For example, telecommunication networks, network applications, real-time process controls, and parallel computation (i.e., scientific computing) are all fields in which distributed programming is necessary. These non-deterministic programs (i.e., programs that do not always execute in the same manner, but whose program flow is chosen during run time at certain “choice points” specified by the programmer) are essential for, but not limited to, processes that compute exponentially large numbers.
Assisting in program composition, debuggers find and either correct or notify the programmer of flaws in the executing (object) code resulting from their compiled source code. That is, a debugger (or debugging tool) is a computer program that is used to test and debug other programs (i.e., the “target” program). An example includes the Microsoft Visual Studio Debugger available from Microsoft Corporation of Redmond, Wash. Debuggers assist programmers in analyzing newly-written source code by typically providing functions such as running a program step-by-step (i.e., single-stepping or program animation), stopping (or pausing) the program to examine the current state at some event or specified instruction by means of a “breakpoint,” and tracking the values of variables.
The debugging process is relatively simple for programs that execute in a serial fashion (i.e., processing data operations individually and in turn). This is not the case, however, for program code that executes in an out-of-sequence (i.e., parallel) manner. For such parallel programs, debuggers attach simultaneously to individual processes. This often results in inaccuracies. For example, libraries often allow program loops to execute out of order. Yet, conventional debugging programs will collect these libraries during compilation, and hit the set breakpoints in random order (and thus, not provide the programmer-user with a deterministic debugging experience).